package com.example.core.filter.gray;

import com.example.core.context.GatewayContext;
import com.example.core.filter.Filter;
import com.example.core.filter.FilterAspect;
import lombok.extern.slf4j.Slf4j;

import static com.example.common.constants.FilterConst.*;

/**
 * @Author Peng Yisheng
 * @Date 2024/12/10 5:15
 * @Description 灰度过滤器
 */
@Slf4j
@FilterAspect(id = GRAY_FILTER_ID,
        name = GRAY_FILTER_NAME,
        order = GRAY_FILTER_ORDER)
public class GrayFilter implements Filter {
    public static final String GRAY = "true";

    @Override
    public void doFilter(GatewayContext ctx) throws Exception {
        // 测试灰度功能待时候使用  我们可以手动指定其是否为灰度流量
        String gray = ctx.getRequest().getHeaders().get("gray");
        if (GRAY.equals(gray)) {
            // 灰度1：请求指定为灰度请求
            log.info("header:gray");
            ctx.setGray(true);
            return;
        }
        // 选取部分的灰度用户
        String clientIp = ctx.getRequest().getClientIp();
        // 等价于对1024取模
        int res = clientIp.hashCode() & (1024 - 1);
        if (res == 1) {
            // 灰度2：网关指定请求为灰度请求
            log.info("gateway:gray");
            ctx.setGray(true);
        }
    }
}